Skip to content

Sync EUI icon library with Jan–May 2026 renames and additions#3378

Merged
theletterf merged 5 commits into
mainfrom
sync/eui-icons-jan-2026
May 26, 2026
Merged

Sync EUI icon library with Jan–May 2026 renames and additions#3378
theletterf merged 5 commits into
mainfrom
sync/eui-icons-jan-2026

Conversation

@florent-leborgne
Copy link
Copy Markdown
Member

Why

EUI renamed virtually all icons from camelCase to snake_case in January 2026 (elastic/eui#9279) and continued adding new icons through May 2026. Without this sync, docs-builder was serving outdated or missing icon glyphs and would break the build whenever a doc page used a renamed icon name.

What

  • 580 canonical icons now match EUI main exactly — every root icon and all 56 token icons are in sync
  • 97 icon aliases + 56 token aliases added to EuiSvgIcons so that any existing doc page using an old camelCase name (e.g. {icon}\checkCircle`, {icon}`errorFilled`, {icon}`wordWrap``) transparently resolves to the current EUI glyph without a build error — old SVG files deleted, aliases handle resolution
  • ~200 new root SVGs added (new icons like chart_*, drag_*, chevron_*, ellipsis, server, significant_events, etc.)
  • All 56 token SVGs renamed from camelCase (tokenAlias.svg) to snake_case (token_alias.svg) to match EUI
  • docs/syntax/icons.md regenerated from the actual files on disk (580 entries, alphabetical)

How

The alias mechanism lives in EuiSvgIcons.TryGetIcon / GetIcon / TryGetToken. On lookup, the name is checked against a static IconAliases / TokenAliases dictionary first; if matched, the canonical name is substituted before hitting the embedded-resource dictionary. This means old doc pages keep working at zero maintenance cost, and future EUI renames only require adding an alias entry rather than a bulk docs update.

Made with Cursor

EUI renamed virtually all icons from camelCase to snake_case in Jan 2026
(#9279) and has continued adding new icons since. This brings docs-builder
fully up to date.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
@florent-leborgne florent-leborgne requested a review from a team as a code owner May 22, 2026 15:39
@florent-leborgne florent-leborgne requested a review from a team as a code owner May 22, 2026 15:39
@florent-leborgne florent-leborgne requested a review from Mpdreamz May 22, 2026 15:39
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 22, 2026

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 155e6988-91dd-4074-a4ad-44db32314576

📥 Commits

Reviewing files that changed from the base of the PR and between 7e90c4e and 08b4823.

📒 Files selected for processing (1)
  • docs/syntax/icons.md

📝 Walkthrough

Walkthrough

This PR adds IconAliases and TokenAliases dictionaries to EuiSvgIcons and updates TryGetIcon, TryGetToken, GetIcon(string), and GetIcon(string, string? cssClass) to resolve names through those aliases before retrieving or returning SVG content (with optional CSS class injection). The docs "Available Icons" table is updated to use canonical snake_case icon identifiers.

Sequence Diagram(s)

sequenceDiagram
  participant Caller
  participant EuiSvgIcons
  participant IconAliases
  participant SvgDictionary

  Caller->>EuiSvgIcons: TryGetIcon(name) / GetIcon(name[, cssClass])
  EuiSvgIcons->>IconAliases: Resolve(name) -> canonicalName?
  IconAliases-->>EuiSvgIcons: canonicalName (or original)
  EuiSvgIcons->>SvgDictionary: Lookup(canonicalName)
  SvgDictionary-->>EuiSvgIcons: SVG content (string)
  EuiSvgIcons->>EuiSvgIcons: If cssClass provided -> inject class into SVG
  EuiSvgIcons-->>Caller: Return SVG string
Loading
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main change: syncing the EUI icon library with recent renames (camelCase to snake_case) and additions from January through May 2026.
Description check ✅ Passed The description is comprehensive and directly related to the changeset, explaining the motivation, implementation details, and scope of the icon library synchronization.
Docstring Coverage ✅ Passed Docstring coverage is 80.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
✨ Simplify code
  • Create PR with simplified code
  • Commit simplified code in branch sync/eui-icons-jan-2026

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
docs/syntax/icons.md (1)

665-665: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Usage examples should demonstrate canonical icon names.

The examples use the legacy alias checkCircle instead of the canonical check_circle. Update examples to use canonical snake_case names to guide users toward current naming conventions.

📝 Proposed fix
 |     Status     | Description |
 |:--------------:|:------------|
-| {icon}`checkCircle` | Success     |
+| {icon}`check_circle` | Success     |
 |   {icon}`warning`   | Warning     |
 |    {icon}`error`    | Error       |

And in the Markdown block:

 |     Status     | Description |
 |:--------------:|:------------|
-| {icon}`checkCircle` | Success     |
+| {icon}`check_circle` | Success     |
 |   {icon}`warning`   | Warning     |
 |    {icon}`error`    | Error       |

Also applies to: 675-675

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/syntax/icons.md` at line 665, Update the example icon names to use
canonical snake_case forms: replace the legacy alias checkCircle with
check_circle in the icons documentation (the table row containing
"{icon}`checkCircle`" and any other occurrences such as the one noted at line
675), ensuring all usage examples show the canonical names so users are guided
to the current naming convention.
src/Elastic.Documentation.Svg/EuiSvgIcons.cs (1)

257-258: ⚠️ Potential issue | 🔴 Critical | ⚡ Quick win

GetToken does not resolve token aliases.

Every other lookup method (TryGetIcon, TryGetToken, GetIcon overloads) resolves aliases, but GetToken does not. This breaks the transparent alias resolution contract and creates an inconsistent API.

🔧 Proposed fix
 public static string? GetToken(string name) =>
-    Tokens.TryGetValue(name, out var svg) ? svg : null;
+{
+    if (TokenAliases.TryGetValue(name, out var canonical))
+        name = canonical;
+    return Tokens.TryGetValue(name, out var svg) ? svg : null;
+}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/Elastic.Documentation.Svg/EuiSvgIcons.cs` around lines 257 - 258,
GetToken currently returns Tokens.TryGetValue(name) directly and therefore
doesn't resolve aliases; update GetToken to mirror the alias-resolution behavior
used by TryGetIcon/TryGetToken/GetIcon overloads: if Tokens.TryGetValue(name)
fails, check the token alias mapping (e.g., TokenAliases or similar alias
dictionary used elsewhere), follow the alias target(s) until you arrive at a
real token name (guarding against cycles or excessive depth), then return the
looked-up SVG from Tokens, or null if none found. Ensure you reference GetToken,
Tokens, and the existing alias dictionary/methods used by TryGetIcon/TryGetToken
so behavior is consistent across lookups.
🧹 Nitpick comments (1)
docs/syntax/icons.md (1)

268-268: 💤 Low value

Icon name uses camelCase inconsistent with surrounding snake_case names.

indexTemporary stands out as the only camelCase icon name in a table of snake_case names. If this is the actual canonical name on disk, consider renaming it to index_temporary for consistency with the EUI snake_case convention.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/syntax/icons.md` at line 268, The icon name in the docs uses camelCase
(`indexTemporary`) which is inconsistent with the surrounding snake_case
convention; rename the symbol to `index_temporary` in the docs table (replace
`{icon}`indexTemporary`` with `{icon}`index_temporary``) and, if the actual
asset on disk is named `indexTemporary`, rename the asset and any references
(imports, CSS classes, examples) to `index_temporary` consistently across the
repo (search for `indexTemporary` and update all occurrences, including
references in functions/components that use the icon).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@docs/syntax/icons.md`:
- Line 665: Update the example icon names to use canonical snake_case forms:
replace the legacy alias checkCircle with check_circle in the icons
documentation (the table row containing "{icon}`checkCircle`" and any other
occurrences such as the one noted at line 675), ensuring all usage examples show
the canonical names so users are guided to the current naming convention.

In `@src/Elastic.Documentation.Svg/EuiSvgIcons.cs`:
- Around line 257-258: GetToken currently returns Tokens.TryGetValue(name)
directly and therefore doesn't resolve aliases; update GetToken to mirror the
alias-resolution behavior used by TryGetIcon/TryGetToken/GetIcon overloads: if
Tokens.TryGetValue(name) fails, check the token alias mapping (e.g.,
TokenAliases or similar alias dictionary used elsewhere), follow the alias
target(s) until you arrive at a real token name (guarding against cycles or
excessive depth), then return the looked-up SVG from Tokens, or null if none
found. Ensure you reference GetToken, Tokens, and the existing alias
dictionary/methods used by TryGetIcon/TryGetToken so behavior is consistent
across lookups.

---

Nitpick comments:
In `@docs/syntax/icons.md`:
- Line 268: The icon name in the docs uses camelCase (`indexTemporary`) which is
inconsistent with the surrounding snake_case convention; rename the symbol to
`index_temporary` in the docs table (replace `{icon}`indexTemporary`` with
`{icon}`index_temporary``) and, if the actual asset on disk is named
`indexTemporary`, rename the asset and any references (imports, CSS classes,
examples) to `index_temporary` consistently across the repo (search for
`indexTemporary` and update all occurrences, including references in
functions/components that use the icon).

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 9466d9af-4f4c-4900-9fc1-610b31f20ab8

📥 Commits

Reviewing files that changed from the base of the PR and between 477a319 and cd1d516.

⛔ Files ignored due to path filters (298)
  • src/Elastic.Documentation.Svg/svgs/align_bottom.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/align_bottom_left.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/align_bottom_right.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/align_center_horizontal.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/align_center_vertical.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/align_left.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/align_right.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/align_top.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/align_top_left.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/align_top_right.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/analyze_event.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/archive.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/arrow_down.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/arrow_left.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/arrow_right.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/axis_x.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/axis_y_left.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/axis_y_right.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/bell_slash.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/bolt.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/branch_user.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/briefcase.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/bulb.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/bullseye.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chart_anomaly.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chart_area.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chart_area_stack.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chart_bar_horizontal.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chart_bar_horizontal_stack.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chart_bar_vertical.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chart_bar_vertical_stack.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chart_change_point.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chart_gauge.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chart_heatmap.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chart_line.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chart_metric.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chart_pie.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chart_tag_cloud.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chart_threshold.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chart_waterfall.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/checkInCircleFilled.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/check_circle.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/check_circle_fill.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chevron_double_left.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chevron_double_right.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chevron_limit_left.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chevron_limit_right.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chevron_single_down.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chevron_single_left.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chevron_single_right.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chevron_single_up.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/clickLeft.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/clickRight.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/click_left.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/click_right.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/clock_control.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/clock_counter.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/cloud.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/cloud_drizzle.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/cloud_stormy.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/cloud_sunny.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/command_line.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/compare.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/continuity_above.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/continuity_above_below.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/continuity_below.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/continuity_within.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/contrastHigh.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/contrast_fill.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/cross_circle.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/crosshair.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/dashed_circle.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/display.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/distribute_horizontal.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/distribute_vertical.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/document_edit.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/documents.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/dot_in_circle.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/doubleArrowLeft.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/drag.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/drag_horizontal.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/drag_vertical.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/editor_distribute_horizontal.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/editor_distribute_vertical.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/editor_item_align_bottom.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/editor_item_align_center.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/editor_item_align_left.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/editor_item_align_middle.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/editor_item_align_right.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/editor_item_align_top.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/editor_position_bottom_left.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/editor_position_bottom_right.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/editor_position_top_left.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/editor_position_top_right.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/ellipsis.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/errorFilled.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/error_fill.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/esql_vis.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/expandMini.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/external.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/eye_slash.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/filter_exclude.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/filter_ignore.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/filter_in_circle.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/filter_include.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/folder_close.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/folder_closed.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/folder_open.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/frame_next.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/frame_previous.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/fullScreenExit.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/full_screen_exit.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/grab_omnidirectional.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/hourglass.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/if.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/index_close.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/index_edit.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/index_open.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/index_runtime.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/index_settings.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/inputOutput.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/input_output.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/kubernetesPod.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/kubernetes_node.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/kubernetes_pod.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/lineDashed.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/lineDotted.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/lineSolid.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/line_break.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/line_break_slash.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/line_dash.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/line_dot.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/line_solid.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/link_slash.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/list_bullet.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/list_check.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/list_number.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/lock_open.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/log_out.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/magnify.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/magnify_exclamation.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/magnify_minus.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/magnify_plus.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/magnify_with_exclamation.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/magnify_with_minus.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/magnify_with_plus.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/mail.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/map.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/mapping.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/maximize.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/megaphone.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/menuLeft.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/menuRight.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/menu_down.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/menu_left.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/menu_right.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/menu_up.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/minus_circle.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/minus_in_circle_filled.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/minus_in_square.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/minus_square.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/money.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/page_select.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/pagesSelect.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/pages_select.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/paint_bucket.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/pattern.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/pin_fill.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/pipeBreaks.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/pipeNoBreaks.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/play_filled.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/plus_circle.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/plus_in_square.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/plus_square.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/popper.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/presentation.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/processor.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/product_agent.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/product_cloud_infra.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/product_dashboard.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/product_discover.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/product_ml.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/product_streams_classic.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/product_streams_wired.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/query.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/query_field.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/query_operand.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/query_selector.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/query_value.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/queue.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/radar.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/readOnly.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/read_only.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/redo.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/refresh_time.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/return.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/rocket.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/scissors.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/section.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/security_signal.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/security_signal_detected.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/security_signal_resolved.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/send.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/server.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/session_viewer.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/significant_events.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/sortAscending.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/sortDescending.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/sort_ascending.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/sort_descending.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/sort_left.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/sort_right.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/star.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/star_fill.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/star_fill_space.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/star_filled.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/star_minus_fill.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/star_plus_empty.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/star_plus_fill.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/stop_fill.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/table.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/table_density_high.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/table_density_low.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/table_info.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/table_of_contents.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/table_time.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/text.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/text_align_center.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/text_align_left.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/text_align_right.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/text_bold.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/text_heading.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/text_italic.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/text_strike.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/text_underline.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/thermometer.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/thumbDown.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/thumbUp.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/thumb_down.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/thumb_up.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/timeline.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/timelineWithArrow.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/timeline_with_arrow.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_alias.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_annotation.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_array.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_binary.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_boolean.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_class.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_completion_suggester.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_constant.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_date.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_dimension.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_element.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_enum.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_enum_member.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_event.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_exception.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_field.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_file.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_flattened.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_function.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_geo.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_histogram.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_interface.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_ip.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_join.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_key.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_keyword.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_method.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_metric_counter.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_metric_gauge.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_module.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_namespace.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_nested.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_null.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_number.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_object.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_operator.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_package.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_parameter.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_percolator.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_property.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_range.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_rank_feature.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_rank_features.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_repo.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_search_type.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_semantic_text.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_shape.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_string.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_struct.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_symbol.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_tag.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_text.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_token_count.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_variable.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_vector_dense.svg is excluded by !**/*.svg
📒 Files selected for processing (2)
  • docs/syntax/icons.md
  • src/Elastic.Documentation.Svg/EuiSvgIcons.cs

pipeBreaks was renamed to line_break (not pipe_breaks) and
pipeNoBreaks to line_break_slash per EUI batch rename commit 1a42be0c.

Co-authored-by: Cursor <cursoragent@cursor.com>
florent-leborgne added a commit to elastic/docs-content that referenced this pull request May 25, 2026
Switches the NL-enabled state description from a magnify+sparkles
combo to the single magnify_sparkles glyph added in
elastic/docs-builder#3378.

Co-authored-by: Cursor <cursoragent@cursor.com>
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/Elastic.Documentation.Svg/EuiSvgIcons.cs (1)

257-258: ⚠️ Potential issue | 🔴 Critical | ⚡ Quick win

Missing token alias resolution in GetToken.

GetToken doesn't resolve token aliases before lookup, breaking backward compatibility for legacy camelCase token names. All other public methods (TryGetIcon, TryGetToken, both GetIcon overloads) resolve aliases first.

🔧 Proposed fix
 public static string? GetToken(string name) =>
-    Tokens.TryGetValue(name, out var svg) ? svg : null;
+{
+    if (TokenAliases.TryGetValue(name, out var canonical))
+        name = canonical;
+    return Tokens.TryGetValue(name, out var svg) ? svg : null;
+}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/Elastic.Documentation.Svg/EuiSvgIcons.cs` around lines 257 - 258,
GetToken currently looks up the raw name in Tokens
(Tokens.TryGetValue(name,...)) and therefore fails for legacy/camelCase token
aliases; change it to resolve aliases the same way as
TryGetToken/TryGetIcon/GetIcon by first normalizing the input (e.g. var
resolvedName = ResolveAlias(name) or call the shared alias-resolution helper
used by the other methods) and then call Tokens.TryGetValue(resolvedName, out
var svg) ? svg : null so alias names return the correct token.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@src/Elastic.Documentation.Svg/EuiSvgIcons.cs`:
- Around line 257-258: GetToken currently looks up the raw name in Tokens
(Tokens.TryGetValue(name,...)) and therefore fails for legacy/camelCase token
aliases; change it to resolve aliases the same way as
TryGetToken/TryGetIcon/GetIcon by first normalizing the input (e.g. var
resolvedName = ResolveAlias(name) or call the shared alias-resolution helper
used by the other methods) and then call Tokens.TryGetValue(resolvedName, out
var svg) ? svg : null so alias names return the correct token.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 3a673012-d2c0-4e22-83d3-674df6874190

📥 Commits

Reviewing files that changed from the base of the PR and between cd1d516 and 7e90c4e.

⛔ Files ignored due to path filters (1)
  • src/Elastic.Documentation.Svg/svgs/magnify_sparkles.svg is excluded by !**/*.svg
📒 Files selected for processing (1)
  • src/Elastic.Documentation.Svg/EuiSvgIcons.cs

@theletterf
Copy link
Copy Markdown
Member

@florent-leborgne Out of curiosity, how many icon roles are we using throughout the docs presently? We could consider converting them to the new format using AI and then remove the aliases later on.

@theletterf theletterf merged commit 511f0b0 into main May 26, 2026
24 checks passed
@theletterf theletterf deleted the sync/eui-icons-jan-2026 branch May 26, 2026 09:08
@florent-leborgne
Copy link
Copy Markdown
Member Author

florent-leborgne commented May 26, 2026

We could consider converting them to the new format using AI and then remove the aliases later on.

Yes that's probably something we should do regularly, but I think we still need the logic to handle transitions (release change in docs builder, then clean up, etc.)

florent-leborgne added a commit to elastic/docs-content that referenced this pull request May 26, 2026
…ditor (#6350) (#6692)

## Summary

-> Requires elastic/docs-builder#3378 to land
first for the updated icons used in the NL section. Until then, CI will
fail.

This PR addresses #6350 with the following changes to
`explore-analyze/query-filter/languages/esql-kibana.md`:

- Renames the section that documents the ES|QL editor search bar from
`### Free-text quick search` to `### Build queries with KQL or natural
language`. The previous title relied on "Quick search", which is an
internal Kibana code name and never appears in the product UI.
- Restructures the section into two parallel H4 children (`#### Filter
your data with KQL` and `#### Generate a query from natural language`),
so KQL stays available on 9.3+ and the natural-language mode is
documented as a new preview capability on 9.5+ and on serverless.
- Preserves the existing `esql-kibana-quick-search` anchor on the parent
section to avoid breaking external links (Kibana code, blog posts, other
docs). The new NL subsection uses the consistent
`esql-kibana-quick-search-nl` anchor.
- Drops every `**Quick search**` bold pseudo-label from prose. The
trigger button in `ESQLMenu` is icon-only with no visible text label;
the only "Quick search" string was on a `QuickSearchAction` footer
button that has been dead code since the Feb 2026 editor redesign (PR
[#251223](elastic/kibana#251223)).
- Uses `` {icon}`magnify` `` for the trigger (matches the plain icon
state seen by users without natural-language access) and ``
{icon}`magnify_sparkles` `` in the NL section to match the
sparkles-magnify glyph shown in product when natural language is
enabled. The glyph is a custom Kibana SVG (`MagnifySparklesIcon`); it
has been added to docs-builder in elastic/docs-builder#3378 so it can be
rendered via the `{icon}` directive.

Key factual notes the issue body got wrong:

- The feature gate was a **feature flag** (`esql.nlToEsqlEnabled`), not
an advanced setting. Since the flag was never documented publicly, there
is no "advanced setting instruction" to remove; the change is purely
additive.
- The license gate is **Enterprise**, not "non-basic" — verified at HEAD
in `use_nl_to_esql_check.ts` (`license.hasAtLeast('enterprise')`).
- The feature is still marked **Technical preview** in the UI (flask
icon + `techPreviewTooltip` in `editor_visor/index.tsx`), so the docs
use `preview` rather than `ga` for the new content.
- Natural language mode also requires a configured LLM connector; the
backend rejects the call with `No AI connector configured` otherwise
(`nl_to_esql_route.ts`).
- The current query in the editor is sent to the LLM as additional
context (`buildNlToEsqlAdditionalContext` in `nl_to_esql_route.ts`), so
I added a tip about follow-up requests.

## Resolves

Closes #6350

## Screenshots

- [x] Added `explore-analyze/images/kibana-esql-search-bar-nl.png` to
the new `Generate a query from natural language` subsection, showing the
mode selector open with **Natural language** selected and a sample
prompt running against sample data.
- The existing KQL GIF (`esql-quick-search-kql.gif`) is kept as-is in
the KQL subsection. For users without an Enterprise license, the search
icon stays as the plain magnify glyph and the mode selector is hidden,
so the GIF still accurately reflects what they see — no update needed.

---

> **AI-generated draft** — created with Claude Opus 4.7.
> Review all generated content for factual accuracy before merging.

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Liam Thompson <leemthompo@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants